package fafmessenger_server.mapper;

import fafmessenger_server.control.Database;
import fafmessenger_server.entity.User;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class Users extends ArrayList<User> {
	
	private Database database;	// De database waarmee queries kunnen worden uitgevoerd. 
	
	public Users() {
		super();
		
		database = Database.getRef();
		
		retrieve();
	}
	
	/**
	 * Haal alle gebruikers op uit de database, maak voor elke gebruiker een object aan 
	 * en voeg deze toe aan deze lijst.
	 * 
	 * @return Boolean Geeft true/false terug afhankelijk van of de gebruikers zijn opgehaald en toegevoegd aan deze lijst.
	 */
	private boolean retrieve() {
		boolean returnvalue = false;
		
		if (database.connect()) {
			synchronized (this) {
				ResultSet result = database.executeQuery("SELECT * FROM user");
				
				if (result != null) {
					this.clear();
					
					try {
						while (result.next()) {
							User user = new User(result.getString(1));
							this.add(user);
						}
						
						returnvalue = true;
						result.close();
						
					} catch (SQLException e) {
						e.printStackTrace();
					}				
				}	
			}
			
			database.disconnect();
		}
		
		return returnvalue;
	}
	
	/**
	 * Voegt een gebruiker toe aan de database en deze lijst.
	 * 
	 * @param user User De gebruiker die toegevoegd moet worden.
	 * @return Boolean Geeft true/false terug afhankelijk van of de gebruiker is toegevoegd.
	 */
	public boolean insert(User user) {
		boolean returnvalue = false;
		
		if (database.connect()) {
			synchronized (this) {
				String query = 	"INSERT INTO user " +
								"VALUES ('" + user.getMobilenumber() + "');";
				returnvalue = database.executeUpdate(query);
				database.disconnect();
				
				if (returnvalue) {
					this.add(user);
				}
			}
		}
		
		return returnvalue;
	}
	
	/**
	 * Voegt een lijst met gebruikers toe aan de database en deze lijst.
	 * 
	 * @param users ArrayList<User> De lijst met gebruikers die toegevoegd moet worden.
	 * @return Boolean Geeft true/false terug afhankelijk van of de gebruikers zijn toegevoegd.
	 */
	public boolean insertAll(ArrayList<User> users) {
		boolean returnvalue = false;
		
		if (database.connect()) {
			synchronized (this) {
				for (User u : users) {
					String query = 	"INSERT INTO user " +
									"VALUES ('" + u.getMobilenumber() + "');";
					returnvalue = database.executeUpdate(query);
					
					if (returnvalue) {
						this.add(u);
					} else {
						break;
					}
				}
			}
			
			database.disconnect();
		}
		
		return returnvalue;
	}
	
	/**
	 * Verwijderd een gebruiker uit de database en deze lijst.
	 * 
	 * @param user User De gebruiker die verwijderd moet worden.
	 * @return Boolean Geeft true/false terug afhankelijk van of de gebruiker verwijderd is.
	 */
	public boolean delete(User user) {
		boolean returnvalue = false;
		
		if (database.connect()) {
			synchronized (this) {
				String query = 	"DELETE FROM user " +
								"WHERE `mobilenumber` = '" + user.getMobilenumber() + "';";
				returnvalue = database.executeUpdate(query);
				database.disconnect();
			}
		}
		
		return returnvalue;
	}
	
	/**
	 * Verwijderd alle gebruikers uit de database en in deze lijst.
	 * 
	 * @return Boolean Geeft true/false terug afhankelijk van of alle gebruikers zijn verwijderd.
	 */
	public boolean deleteAll() {
		boolean returnvalue = false;
		
		if (database.connect()) {
			synchronized (this) {
				for (User u : this) {
					String query = 	"DELETE FROM user " +
									"WHERE `mobilenumber` = '" + u.getMobilenumber() + "';";
					returnvalue = database.executeUpdate(query);
					database.disconnect();
					
					if (returnvalue) {
						this.remove(u);
					} else {
						break;
					}
				}
			}
		}
		
		return returnvalue;
	}
	
	/**
	 * Geef de gebruiker terug die hoort bij het gegeven mobielenummer.
	 * 
	 * @param mobilenumber String Het mobielenummer van de gebruiker.
	 * @return User De gebruiker met het gegeven mobielenummer.
	 */
	public User getByMobilenumber(String mobilenumber) {
		User returnvalue = null;
		for (User u : this) {
			if (u.getMobilenumber().equalsIgnoreCase(mobilenumber)) {
				returnvalue = u;
				break;
			}
		}
		return returnvalue;
	}
}
